package com.cfuture08.eweb4j.config;

import java.io.File;

import com.cfuture08.eweb4j.cache.IOCConfigBeanCache;
import com.cfuture08.eweb4j.cache.MVCConfigBeanCache;
import com.cfuture08.eweb4j.cache.ORMConfigBeanCache;
import com.cfuture08.eweb4j.cache.SingleBeanCache;
import com.cfuture08.eweb4j.config.bean.ConfigBean;
import com.cfuture08.eweb4j.ioc.config.IOCConfig;
import com.cfuture08.eweb4j.mvc.config.MVCConfig;
import com.cfuture08.eweb4j.orm.config.ORMConfig;
import com.cfuture08.eweb4j.orm.dao.config.DAOConfig;
import com.cfuture08.util.BeanXMLUtil;
import com.cfuture08.util.FileUtil;
import com.cfuture08.util.LogUtil;
import com.cfuture08.util.StringUtil;

/**
 * EWeb4J配置
 * 
 * @author cfuture.aw
 * @since v1.a.0
 * 
 */
public class EWeb4JConfig {
	public synchronized static String start() {
		String error = null;
		boolean readXml = true;
		if (ConfigConstant.SUCCESS_START.equals(String.valueOf(SingleBeanCache
				.get(ConfigConstant.SUCCESS_START)))) {
			ConfigBean cb = (ConfigBean) SingleBeanCache
					.get(ConfigConstant.CONFIGBEAN_ID);
			String debug = (cb == null ? "true" : cb.getDebug());
			if ("true".equals(debug) || "1".equals(debug)) {
				// 如果开了DEBUG,清空缓存，重新读取配置文件
				SingleBeanCache.clear();
				ORMConfigBeanCache.clear();
				IOCConfigBeanCache.clear();
				MVCConfigBeanCache.clear();
				System.out.println("EWeb4J清空缓存");
				LogUtil.getLogger().debug("EWeb4J清空缓存");
				readXml = true;
			} else {
				// 否则，不需要读取配置文件
				readXml = false;
			}
		}

		if (readXml) {
			// 1.读取配置文件
			try {
				ConfigBean cb = (ConfigBean) BeanXMLUtil.getBeanXMLReader(
						new File(ConfigConstant.XMLFILE_PATH)).readOne();
				if (cb == null) {
					error = "EWeb4JConfig.class : 读取不了任何配置文件信息！已经重写了配置文件，请重新填写完整，然后启动框架。";
				} else {
					// 检查配置信息格式是否填写正确
					String error1 = CheckConfigBean.check(cb);
					if (error1 != null) {
						if (error == null) {
							error = error1;
						} else {
							error += error1;
						}
					}
					String error2 = CheckConfigBean.check(cb.getIoc());
					if (error2 != null) {
						if (error == null) {
							error = error2;
						} else {
							error += error2;
						}
					}
					
					String error3 = CheckConfigBean.checkIOCXml(cb.getIoc().getXmlFiles());
					if (error3 != null) {
						if (error == null) {
							error = error3;
						} else {
							error += error3;
						}
					}
					
					String error4 = CheckConfigBean.check(cb.getOrm());
					if (error4 != null) {
						if (error == null) {
							error = error4;
						} else {
							error += error4;
						}
					}
					String error5 = CheckConfigBean.checkORMXml(cb.getOrm().getXmlFiles());
					if (error5 != null) {
						if (error == null) {
							error = error5;
						} else {
							error += error5;
						}
					}
					
					String error6 = CheckConfigBean.check(cb.getMvc());
					if (error6 != null) {
						if (error == null) {
							error = error6;
						} else {
							error += error6;
						}
					}
					String error7 = CheckConfigBean.check(cb.getMvc().getXmlFiles());
					if (error7 != null) {
						if (error == null) {
							error = error7;
						} else {
							error += error7;
						}
					}

					if (error == null) {
						// 验证通过，将读取到的信息放入缓存池中
						SingleBeanCache.add(ConfigConstant.CONFIGBEAN_ID, cb);
						SingleBeanCache.add(cb.getClass(), cb);
						// ------log-------
						String debug = ((ConfigBean) SingleBeanCache
								.get(ConfigConstant.CONFIGBEAN_ID)).getDebug();
						if ("true".equals(debug) || "1".equals(debug)) {
							String info = "EWeb4J框架启动配置文件验证通过，已将读取到的配置信息存入缓存;";
							LogUtil.getLogger().debug(info);
							System.out.println(info);
						}
						// ------log-------
						// 继续验证其他组件配置信息
						if ("true".equals(cb.getOrm().getOpen())
								|| "1".equals(cb.getOrm().getOpen())) {
							error = DAOConfig.check();
							String error8 = ORMConfig.check();
							if (error8 != null) {
								if (error == null) {
									error = error8;
								} else {
									error += error8;
								}
							}
						}
						if ("true".equals(cb.getIoc().getOpen())
								|| "1".equals(cb.getIoc().getOpen())) {
							String error9 = IOCConfig.check();
							if (error9 != null) {
								if (error == null) {
									error = error9;
								} else {
									error += error9;
								}
							}
						}
						if ("true".equals(cb.getMvc().getOpen())
								|| "1".equals(cb.getMvc().getOpen())) {
							String error10 = MVCConfig.check();
							if (error10 != null) {
								if (error == null) {
									error = error10;
								} else {
									error += error10;
								}
							}
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
				// 重写配置文件
				try {
					// 保存为备份文件
					File file = new File(ConfigConstant.XMLFILE_PATH);
					FileUtil.copy(file, new File(ConfigConstant.XMLFILE_PATH
							+ ".back" + "_"
							+ StringUtil.getNowTime("MMddHHmmss")));
					BeanXMLUtil.getBeanXMLWriter(file,
							ConfigBeanCreator.getConfigBean()).write();
					String err = StringUtil.getNowTime()
							+ "EWeb4JConfig : 配置文件读取错误，已重写。异常捕获：";
					LogUtil.getLogger().error(err, e);
					System.out.println(err);
				} catch (Exception e1) {
					e1.printStackTrace();
					String err = StringUtil.getNowTime()
							+ "EWeb4JConfig : 无法重写配置文件！异常捕获：";
					LogUtil.getLogger().error(err, e);
					System.out.println(err);
				}
			}

			if (error != null) {
				LogUtil.getLogger().error(error);
				SingleBeanCache.clear();
				ORMConfigBeanCache.clear();
				IOCConfigBeanCache.clear();
				MVCConfigBeanCache.clear();
			} else {
				SingleBeanCache.add(ConfigConstant.SUCCESS_START,
						ConfigConstant.SUCCESS_START);
			}
		}

		return error;
	}

	public static void main(String[] args) {
		System.out.println(EWeb4JConfig.start());
	}
}
